// 在nodejs端想要使用es6模块化语法，要在package.json中定义"type": "module",
import express from "express";
import "./db/index.js"; // 连接数据库
import TodoList from "./db/models/todoList.js"; // 数据库中的集合

const app = express();

// 解析json格式请求体参数
app.use(express.json());
// 解析form表单提交的请求体参数
// app.use(express.urlencoded());

// 1. 获取todoList列表 get(查)
// axios.get('/todoList')
app.get("/todoList", async (req, res) => {
  try {
    // 去数据库中查询所有todoList
    const todoList = await TodoList.find({}, { __v: 0 });
    // 响应回去
    res.json({
      code: 200,
      message: "",
      succuss: true,
      data: todoList,
    });
  } catch (e) {
    res.status(500).send(e);
  }
});
// 2. 添加todo post(增)
// axios.post('/todo', { title })
app.post("/todo", async (req, res) => {
  /*
    req request 请求对象（所有请求的内容都在req）
      客户端发送给服务器的内容就是请求内容
    res response 响应对象（所有响应的内容都在res）
      服务器发送给客户端的内容就是响应内容
  */
  // 获取post请求的请求体参数
  // id必须由服务器生成
  const { title } = req.body;
  await TodoList.create({ title });
  res.json({
    code: 200,
    message: "",
    succuss: true,
    data: null,
  });
});

// 3. 修改todo put(改)
// axios.put('/todo', { _id, isDone })
app.put("/todo", async (req, res) => {
  const { _id, isDone } = req.body;
  await TodoList.updateOne({ _id }, { $set: { isDone } });
  res.json({
    code: 200,
    message: "",
    succuss: true,
    data: null,
  });
});

// 4. 单个删除todo delete(删)
// axios.delete('/todo/{ _id }')
app.delete("/todo/:_id", async (req, res) => {
  const { _id } = req.params;
  await TodoList.deleteOne({ _id });
  res.json({
    code: 200,
    message: "",
    succuss: true,
    data: null,
  });
});

// 5. 全选&全不选 put
// axios.put('/todoList', { todoIdList, isDone })
app.put("/todoList", async (req, res) => {
  const { todoIdList, isDone } = req.body;
  await TodoList.updateMany({ _id: { $in: todoIdList } }, { $set: { isDone } });
  res.json({
    code: 200,
    message: "",
    succuss: true,
    data: null,
  });
});

// 6. 批量删除 delete
// axios.delete('/todoList', { params: { todoIdList } })
app.delete("/todoList", async (req, res) => {
  const { todoIdList } = req.query;
  await TodoList.deleteMany({ _id: { $in: todoIdList } });
  res.json({
    code: 200,
    message: "",
    succuss: true,
    data: null,
  });
});

app.listen(3000, "localhost", (err) => {
  // 错误优先机制（回调函数的第一个参数往往都是error，建议先处理错误）
  if (err) console.log("服务器启动失败了", err);
  else console.log("服务器启动成功了");
});
